home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 35 / Amiga Format AFCD35 (Issue 119, Jan 1999).iso / -in_the_mag- / reader_requests / fredobbutils / bbsrc / memchk.s < prev    next >
Text File  |  1998-11-06  |  7KB  |  427 lines

  1. *** Bootblock Spécial:    MEMCHK    1.0
  2. * Coded by Frédéric Bassaler '95
  3.  
  4. *** Au moment du boot:
  5. * bouton DROIT de la souris  =>    MemChk
  6. *    - examine les vecteurs d'execbase
  7. *    - visualisation de la mémoire
  8. * --> permet donc de détecter la présence d'un virus ou autre code résident
  9.  
  10. * Si les vecteurs de Reset ne sont pas à 0 au moment du boot,
  11. * alors MemChk apparait
  12.  
  13. *
  14. * ENGLISH-SPEAKING PEOPLE PLEASE READ MemChk20.S
  15. *
  16.  
  17.     incdir    asm:/Include/
  18.     include    equ.s
  19.     include    exec/types.i
  20.     include    graphics/text.i
  21.     include    graphics/gfx.i
  22.     include    graphics/rastport.i
  23.  
  24.     rsreset
  25. planes    rs.l    1
  26. ;gfxbase    rs.l    1
  27. olddma    rs.w    1
  28. Xstart    rs.w    1
  29. Ystart    rs.w    1
  30. diskio    rs.l    1
  31. Offset    rs.l    1
  32. Vectors    rs.l    12
  33. rast    rs.b    rp_SIZEOF
  34. bmap    rs.b    bm_SIZEOF
  35. VARSIZE    rs.w    0
  36.  
  37. Width=320*2
  38. Height=256
  39. Depth=1
  40. PlaneSize=((Width/8)*Height)*Depth
  41.  
  42. DMPYStart=54
  43. NCHR=70
  44. NLINES=26
  45. DMPSIZE=NCHR*NLINES
  46.  
  47. COL0=$b88
  48. COL1=$000
  49.  
  50. DBUG=0    ;1=debug enabled
  51.  
  52. Start:
  53.     IFEQ    DBUG
  54.     dc.b    "DOS",0
  55.     dc.l    0
  56.     dc.l    $370
  57.     ENDC
  58.  
  59.     IFEQ    DBUG
  60.     tst.l    46(a6)
  61.     bne.b    MemChk
  62.     tst.l    550(a6)
  63.     bne.b    MemChk
  64.     btst    #10,$dff016
  65.     bne.w    Init
  66.     ENDC
  67. MemChk
  68.     movem.l    d0-a6,-(sp)
  69.     lea    -VARSIZE(sp),sp    ;on utilise la pile comme base des variables
  70.     move.l    sp,a5        ;VarBase en a5
  71.  
  72. * éteindre moteur
  73. ;    IFEQ    DBUG
  74. ;    move.l    a1,DiskIo(a5)
  75. ;    bsr.w    MotorOff
  76. ;    ENDC
  77.  
  78.     IFNE    DBUG
  79.     move.l    4.w,a6
  80.     ENDC
  81. *** Mettre en place le contexte graphique
  82. * Allouer buffer pour bitplanes & coplist
  83.     move.l    #BufSize,d0
  84.     moveq    #2,d1
  85.     jsr    AllocMem(a6)
  86.     move.l    d0,(a5)
  87.     move.l    d0,d4
  88.  
  89.     move.l    $9c(a6),d6        ;gfxbase en d6
  90.  
  91.     lea    rast(a5),a1
  92.     move.l    a1,-(sp)
  93.     move.l    d6,a6
  94.     jsr    InitRastPort(a6)
  95.  
  96.     lea    bmap(a5),a0
  97.     move.l    d4,bm_Planes(a0)    ;adresse des bitplanes
  98.     move.l    (sp)+,a1
  99.     move.l    a0,rp_BitMap(a1)
  100.     moveq    #Depth,d0
  101.     move    #Width,d1
  102.     move    #Height,d2
  103.     jsr    InitBitMap(a6)
  104.  
  105.     lea    topaz8(pc),a0
  106.     move.l    154(a6),a1
  107.     move.l    10(a1),(a0)    ;ln_name: topaz.font
  108.     jsr    OpenFont(a6)
  109.     move.l    d0,a0
  110.     lea    rast(a5),a1
  111.     jsr    SetFont(a6)
  112.  
  113.     bsr.w    ClrSc
  114.     lea    main.txt(pc),a0
  115.     bsr.w    print
  116.  
  117.     lea    $dff000,a4
  118.     move    $02(a4),olddma(a5)
  119.     or    #$8000,olddma(a5)
  120.     move    #$7fff,$96(a4)        ;bloquer DMA
  121.     lea    coplist(pc),a0
  122. * adresse des bitplanes
  123.     move.l    (a5),d0        ;planes(a5)
  124.     move.l    d0,a1
  125.     move    d0,lo1-coplist(a0)
  126.     swap    d0
  127.     move    d0,hi1-coplist(a0)
  128. * copier coplist en mém chip
  129.     lea    PlaneSize(a1),a1
  130.     move.l    a1,a2
  131.     moveq    #(CopSize/4)-1,d0
  132. .cop
  133.     move.l    (a0)+,(a1)+
  134.     dbf    d0,.cop
  135.     move.l    a2,$80(a4)    ;adresse de notre coplist
  136.     clr    $88(a4)
  137.     move    #%1000011111010000,$96(a4)    ;canaux DMA
  138. ********************************************************
  139.     move.l    4.w,a6
  140.     lea    Vectors(a5),a0
  141.     move.l    a0,a1
  142.     move.l    a0,a3
  143.     lea    42(a6),a2
  144.     REPT    3
  145.     move.l    (a2)+,(a0)+
  146.     ENDR
  147.  
  148.     lea    546(a6),a2
  149.     REPT    3
  150.     move.l    (a2)+,(a0)+
  151.     ENDR
  152.     move.l    144(a6),(a0)+    ;IntVector: VertBlank Interrupt
  153.     moveq    #-1,d0        ;-1=fin
  154.     move.l    d0,(a0)
  155.     lea    vector.txt(pc),a0
  156.     bsr.w    RawPrint
  157.  
  158. *** AsciiDump de la mémoire 'occupée' par le code résident
  159.     move.l    46(a6),d0    ;coolcapture: pointeur sur prg résident
  160.     bne.b    .dmp
  161.     move.l    550(a6),d0    ;kicktagptr
  162.     bne.b    .dmp
  163.     moveq    #0,d0
  164. .dmp    move.l    d0,a0
  165. dmp
  166.     bsr.w    MemDmp
  167. MainLoop:
  168. .z
  169.     move.l    Offset(a5),a0
  170.     move.b    $bfec01,d0
  171.     ror.b    #1,d0
  172.     not.b    d0        ;code rawkey
  173. ;    cmp.b    #$17,d0        ;I
  174. ;    bne.b    .z1
  175. ;    bsr.w    Install
  176. ;    bra.b    .z
  177. .z1    btst    #6,$bfe001
  178.     beq.b    CloseAll
  179. ;    cmp.b    #$40,d0
  180. ;    beq.b    .next_vec
  181.     cmp.b    #$45,d0        ;Esc
  182.     beq.b    Reset
  183.     cmp.b    #$4d,d0
  184.     beq.b    .more
  185.     cmp.b    #$4c,d0
  186.     bne.b    .z
  187. .less
  188.     sub    #DMPSIZE,a0
  189.     bra.b    dmp
  190. .more
  191.     add    #DMPSIZE,a0
  192.     bra.b    dmp
  193. ;.next_vec
  194. ;    move.l    (a3)+,d0
  195. ;    moveq    #-1,d1
  196. ;    cmp.l    d0,d1
  197. ;    bne.b    .nxt
  198. ;    lea    Vectors(a5),a3
  199. ;    bra.b    .z
  200. ;.nxt    move.l    d0,a0
  201. ;    bra.b    dmp
  202. *** Effacer les vecteurs de reset & rebooter
  203. Reset:
  204.     clr.l    46(a6)        ;coolcapture
  205.     clr.l    546(a6)        ;kickmemptr
  206.     clr.l    550(a6)        ;kicktagptr
  207.     clr.l    554(a6)        ;kickchecksum
  208. Reset2
  209.     IFNE    DBUG
  210.     bra.b    CloseAll
  211.     ENDC
  212.     move.l    #$f80000,$80.w
  213.     trap    #0
  214. *** libérer tout
  215. CloseAll:
  216.     move.l    (a5),a1
  217.     move.l    #BufSize,d0
  218.     jsr    FreeMem(a6)
  219.     move.l    d6,a1
  220.     move.l    38(a1),$80(a4)
  221.     clr    $88(a4)
  222.     move    olddma(a5),$96(a4)
  223. fin
  224.     lea    VARSIZE(sp),sp    ;restitue la pile
  225.     movem.l    (sp)+,d0-a6
  226. Init
  227.     IFEQ    DBUG
  228.     move    #COL0,$dff180
  229.     lea    dosname(pc),a1
  230. ;    move.l    #' dos',(a1)
  231. ;    addq.l    #1,a1
  232.     jsr    -96(a6)
  233.     move.l    d0,a0
  234.     move.l    22(a0),a0
  235.     ENDC
  236.     moveq    #0,d0
  237.     rts
  238.  
  239. PutChr    move.b    d0,(a3)+
  240.     rts
  241. *** Formatage & sortie de texte
  242. * <-- a0: format a1: data
  243. RawPrint:
  244.     lea    PutChr(pc),a2
  245.     move.l    (a5),a3
  246.     lea    TextPtr(a3),a3
  247.     move.l    a3,-(sp)
  248.     move.l    4.w,a6
  249.     jsr    -522(a6)
  250.     move.l    (sp)+,a0
  251. *** Sortir du texte
  252. * <-- a0: adr texte (terminé par 0)
  253. print
  254.     movem.l    d0-a6,-(sp)
  255.     movem    Xstart(a5),d0-d1
  256.     move.l    d6,a6
  257.     lea    rast(a5),a3
  258. readchr
  259.     move.b    (a0)+,d7
  260.     beq.b    PrintEnd
  261.     cmp.b    #$a,d7            linefeed
  262.     beq.b    lf
  263.     bsr.b    prnt
  264.     addq    #8,d0
  265.     bra.b    readchr
  266. lf
  267.     addq    #8,d1
  268.     move    Xstart(a5),d0
  269.     bsr.b    Mov
  270.     bra.b    readchr
  271. prnt
  272.     bsr.b    Mov
  273.     movem.l    a0/d0/d1,-(sp)
  274.     subq.l    #1,a0
  275.     moveq    #1,d0
  276. Txt    move.l    a3,a1
  277.     jsr    Text(a6)
  278.     bra.b    movf
  279. Mov
  280.     movem.l    a0/d0/d1,-(sp)
  281.     move.l    a3,a1
  282.     jsr    Move(a6)
  283. movf    movem.l    (sp)+,a0/d0/d1
  284.     rts
  285. PrintEnd
  286.     movem    d0-d1,Xstart(a5)
  287.     movem.l    (sp)+,d0-a6
  288.     rts
  289. *** Effacer l'écran
  290. ClrSc
  291.     movem.l    d0-a6,-(sp)
  292.     move.l    (a5),a0        ;planes(a5)
  293.     move    #(PlaneSize/4)-1,d0
  294. .clr    clr.l    (a0)+
  295.     dbf    d0,.clr
  296.     moveq    #10,d0        ;Xstart
  297.     moveq    #10,d1        ;Ystart
  298.     bra.b    PrintEnd
  299.  
  300. *** MemDump Ascii
  301. * <-- a0: adresse de début
  302. MemDmp:
  303.     movem.l    d0-a6,-(sp)
  304.     move.l    a0,Offset(a5)
  305. .pr
  306.     lea    rast(a5),a3
  307.     moveq    #0,d0
  308.     moveq    #DMPYStart,d1
  309.     move.l    d6,a6
  310.     bsr.b    Mov
  311.  
  312.     move.l    a0,a4
  313.     moveq    #NLINES-1,d5
  314. .prlop
  315.     moveq    #9,d4
  316.     move.l    (a5),a1
  317.     lea    TextPtr(a1),a1
  318.     move.l    a1,-(sp)
  319.     move.l    a0,d7
  320.     bsr.b    Long2Hex
  321.     move.b    #$20,(a1)+
  322.     move.l    (sp)+,a1
  323.     move.l    a0,a4
  324.     move.l    a1,a0
  325.     bsr.b    .Txt
  326.     move.l    a4,a0
  327.     moveq    #NCHR,d4
  328.     bsr.b    .Txt
  329.     lea    NCHR(a0),a0
  330.     moveq    #0,d0
  331.     addq    #8,d1
  332.     bsr.b    Mov
  333.     dbf    d5,.prlop
  334.  
  335.     movem.l    (sp)+,d0-a6
  336.     rts
  337. .Txt
  338.     movem.l    d0/d1/a0,-(sp)
  339.     move.l    d4,d0
  340.     bra.w    Txt
  341.  
  342. *** Hex --> HexString
  343. * <-- d7: long, a1: outputstr
  344. Long2Hex:
  345.     movem.l    d0-d2/a0,-(sp)
  346.     moveq    #7,d2
  347. .bcl    rol.l    #4,d7
  348.     move    d7,d1
  349.     and.b    #$0f,d1
  350.     add.b    #$30,d1
  351.     cmp.b    #$3a,d1
  352.     bcs.b    .ok
  353.     addq.b    #7,d1
  354. .ok    move.b    d1,(a1)+
  355.     dbf    d2,.bcl
  356.     movem.l    (sp)+,d0-d2/a0
  357.     rts
  358.  
  359. ;Install:
  360. ;    move.l    diskio(a5),a1
  361. ;    move    #3,28(a1)
  362. ;    bsr.b    ins
  363. ;    move    #4,28(a1)
  364. ;    bsr.b    ins
  365. ;MotorOff:
  366. ;    move    #9,28(a1)
  367. ;    clr.l    36(a1)
  368. ;    jmp    DoIo(a6)
  369. ;ins
  370. ;    lea    Start(pc),a0
  371. ;    move.l    a0,40(a1)
  372. ;    move.l    #$400,36(a1)
  373. ;    clr.l    44(a1)
  374. ;    move.l    4.w,a6
  375. ;    jmp    DoIo(a6)
  376.  
  377. *** DATA
  378. LORES=$1200
  379. HIRES=LORES!$8000
  380. LACE=4
  381.  
  382. coplist:
  383.  DC.w $100,HIRES
  384.  dc.w $8E,$2981
  385.  DC.w $90,$29c1
  386.  dc.w $92,$3c
  387.  DC.w $94,$D4
  388.  DC.w $180,COL0
  389.  dc.w $182,COL1
  390.  dc.w $e0
  391. hi1:
  392.  dc.w 0
  393.  dc.w $e2
  394. lo1:
  395.  dc.w 0
  396. ; dc.w $580f,$fffe
  397. ; dc.w $180,$0777
  398. ; dc.w $182,$0fff
  399. ; dc.w $ffdf,$fffe
  400. ; dc.w $ff0f,$fffe
  401. ; dc.w $180,COL0
  402.  dc.w $FFFF,$FFFE    ;fin de la liste copper
  403. CopSize=*-coplist
  404. TextPtr=PlaneSize+CopSize
  405. BufSize=TextPtr+6000    ;buffer pour les sorties texte
  406.  
  407. topaz8    dc.l    0
  408.     dc.w    8
  409.     dc.b    0,0
  410. ;gfxname    dc.b "grap"
  411. dosname    dc.b "dos.library",0
  412.  
  413. main.txt
  414.  DC.B "MemChk 1.0 by Frédéric Bassaler.  "
  415.  dc.b "LMB=Exit/ESC=CLR MEM/Up,Down",$a,$a
  416.  dc.b 0
  417. vector.txt
  418.  dc.b "Cold=%lx Cool=%lx Warm=%lx",$a
  419.  dc.b "KickMem=%lx Tag=%lx Chk=%lx",$a
  420.  dc.b "VertB=%lx"
  421.  dc.b 0
  422.  
  423.  dc.b "WHILE BOOTING: RMB = MEMCHK"
  424.  
  425. End:
  426.     dcb.b    512*2,0
  427.